function watchChange(expression) {
	var _expression = _.snakeCase(expression);

	return {
		events: {
			loaded: function() {
				this.handleWatchChanged();
			}
		},
		data: function() {
			var data = {};
			data['changed_' + _expression] = {};
			data['old_' + _expression] = {};
			return data
		},
		methods: {
			removeNewId: function(str) {
				return str.replace(/"id":"new_\d+",/g, '');
			},
			prepareFormData: function() {
				var data = this.beforeSave(this['changed_' + _expression]);
				return this.removeNewId(JSON.stringify(data));
			},
			handleWatchChanged: function() {
				var self = this;
				var obj = this.$get(expression);
				self.$set('old_' + _expression, _.clone(obj, true));
				self['changed_' + _expression] = {id:obj.id};
				Object.keys(obj).forEach(function(key) {
					self.$watch(expression+'.' + key, function() {
						var currentValue = self.$get(expression)[key],
							oldValue = self['old_' + _expression][key];
						if (currentValue === oldValue) {
							delete self['changed_' + _expression][key];
						} else {
							self['changed_' + _expression][key] = currentValue;
						}
					})
				});
			},
		}
	}
}